1 R nerede kullanılır


2 R generation

R yıllar içinde çok fazla değişim gösterdi

https://rss.onlinelibrary.wiley.com/doi/10.1111/j.1740-9713.2018.01169.x

:scale 30%


3 R yükleme

http://www.youtube.com/watch?v=XcBLEVknqvY

What is R?


3.2 RStudio


3.2.2 RStudio


3.2.3 RStudio eklentileri

  • Discover and install useful RStudio addins

https://cran.r-project.org/web/packages/addinslist/README.html

https://rstudio.github.io/rstudioaddins/

devtools::install_github("rstudio/addinexamples", type = "source")

3.3 MacOS için

4 R zor şeyler için kolay, kolay şeyler için zor

R Syntax Comparison::CHEAT SHEET

https://www.amelia.mn/Syntax-cheatsheet.pdf



5 R paketleri

5.1 Neden paketler var




5.3 Kendi paket evrenini oluştur


5.4 R paket yükleme

install.packages("tidyverse", dependencies = TRUE)
install.packages("jmv", dependencies = TRUE)
install.packages("questionr", dependencies = TRUE)
install.packages("Rcmdr", dependencies = TRUE)
install.packages("summarytools")
# install.packages("tidyverse", dependencies = TRUE)
# install.packages("jmv", dependencies = TRUE)
# install.packages("questionr", dependencies = TRUE)
# install.packages("Rcmdr", dependencies = TRUE)
# install.packages("summarytools")

5.5 Paket çağırma

# require(tidyverse)  
# require(jmv)  
# require(questionr)  
# library(summarytools)  
# library(gganimate)  

6 R için yardım bulma

# ?mean
# ??efetch
# help(merge)
# example(merge)

  • Vignette

:scale 80%


https://stackoverflow.com/

  • Google uygun anahtar kelime



  • Google’da ararken [R] yazmak da işe yarayabiliyor.

  • searcher package 📦


http://cran.r-project.org/doc/contrib/Baggott-refcard-v2.pdf

https://www.rstudio.com/resources/cheatsheets/

  • Awesome R

https://github.com/qinwf/awesome-R#readme

https://awesome-r.com/

  • Twitter

https://twitter.com/hashtag/rstats?src=hash


  • Use Reproducible Examples When Asking

8 RStudio ile veri yükleme

https://support.rstudio.com/hc/en-us/articles/218611977-Importing-Data-with-RStudio


8.1 Excel

8.2 SPSS

8.3 CSV


9 Veriyi görüntüleme


10 Veriyi görüntüleme

# library(nycflights13)
# summary(flights)
View(data)
data
head
tail
glimpse
str
skimr::skim()

11 Veriyi değiştirme

11.1 Veriyi kod ile değiştirelim

11.2 Veriyi eklentilerle değiştirme

:scale 30%


11.3 RStudio aracılığıyla recode

questionr paketi kullanılacak

:scale 30%


https://juba.github.io/questionr/articles/recoding_addins.html




12 Basit tanımlayıcı istatistikler

summary()
mean
median
min
max
sd
table()

library(readr)
irisdata <- read_csv("data/iris.csv")

jmv::descriptives(
    data = irisdata,
    vars = "Sepal.Length",
    splitBy = "Species",
    freq = TRUE,
    hist = TRUE,
    dens = TRUE,
    bar = TRUE,
    box = TRUE,
    violin = TRUE,
    dot = TRUE,
    mode = TRUE,
    sum = TRUE,
    sd = TRUE,
    variance = TRUE,
    range = TRUE,
    se = TRUE,
    skew = TRUE,
    kurt = TRUE,
    quart = TRUE,
    pcEqGr = TRUE)

# install.packages("scatr")
scatr::scat(
    data = irisdata,
    x = "Sepal.Length",
    y = "Sepal.Width",
    group = "Species",
    marg = "dens",
    line = "linear",
    se = TRUE)

12.1 summarytools

https://cran.r-project.org/web/packages/summarytools/vignettes/Introduction.html

library(summarytools)
summarytools::freq(iris$Species, style = "rmarkdown")

summarytools::freq(iris$Species, report.nas = FALSE, style = "rmarkdown", headings = FALSE)

with(tobacco, print(ctable(smoker, diseased), method = 'render'))

with(tobacco,
     print(ctable(smoker, diseased, prop = 'n', totals = FALSE),
           omit.headings = TRUE, method = "render"))

summarytools::descr(iris, style = "rmarkdown")

descr(iris,
      stats = c("mean", "sd", "min", "med", "max"),
      transpose = TRUE,
      headings = FALSE,
      style = "rmarkdown")

# view(dfSummary(iris))


# First save the results
iris_stats_by_species <- by(data = iris,
                            INDICES = iris$Species,
                            FUN = descr, stats = c("mean", "sd", "min", "med", "max"),
                            transpose = TRUE)
# Then use view(), like so:
view(iris_stats_by_species, method = "pander", style = "rmarkdown")

# view(iris_stats_by_species)


data(tobacco) # tobacco is an example dataframe included in the package
BMI_by_age <- with(tobacco,
                   by(BMI, age.gr, descr,
                      stats = c("mean", "sd", "min", "med", "max")))
view(BMI_by_age, "pander", style = "rmarkdown")

BMI_by_age <- with(tobacco,
                   by(BMI, age.gr, descr,  transpose = TRUE,
                      stats = c("mean", "sd", "min", "med", "max")))

view(BMI_by_age, "pander", style = "rmarkdown", omit.headings = TRUE)

what.is(iris)

12.2 DataExplorer

library(DataExplorer)
DataExplorer::create_report(df)


12.4 Grafikler

# library(ggplot2)
# library(mosaic)
# mPlot(irisdata)
descr(tobacco, style = 'rmarkdown')

print(descr(tobacco), method = 'render', table.classes = 'st-small')

dfSummary(tobacco, style = 'grid', plain.ascii = FALSE)

print(dfSummary(tobacco, graph.magnif = 0.75), method = 'render')



13 Bazı arayüzler

https://sbalci.github.io/MyRCodesForDataAnalysis/R-Arayuzler.nb.html


13.1 Rcmdr

library(Rcmdr)

Rcmdr::Commander()
  • A Comparative Review of the R Commander GUI for R

http://r4stats.com/articles/software-reviews/r-commander/


15 Sonraki Konular

  • RStudio ile GitHub kullanımı
  • R Markdown ve R Notebook ile tekrarlanabilir rapor
  • Hipotez testleri

16 Geri Bildirim



17 Libraries Used

citation()
citation("tidyverse")
citation("foreign")
citation("tidylog")
citation("janitor")
citation("jmv")
citation("tangram")
citation("finalfit")
citation("summarytools")
citation("ggstatplot")
citation("readxl")
sessionInfo()

18 İletişim

Completed on 2019-09-25 21:01:32.

Serdar Balci, MD, Pathologist

https://rpubs.com/sbalci/CV
https://sbalci.github.io/
https://github.com/sbalci
https://twitter.com/serdarbalci


CommitMessage <- paste("updated on ", Sys.time(), sep = "")

wd <- getwd()

gitCommand <- paste("cd ", wd, " \n git add . \n git commit --message '", CommitMessage, "' \n git push origin master \n", sep = "")

system(command = gitCommand, intern = TRUE
)

  1. Bu bir derlemedir, mümkün mertebe alıntılara referans vermeye çalıştım.↩︎

LS0tCnRpdGxlOiBSIGlsZSBhbmFsaXplIGJhxZ9sYXJrZW5eW0J1IGJpciBkZXJsZW1lZGlyLCBtw7xta8O8biBtZXJ0ZWJlIGFsxLFudMSxbGFyYSByZWZlcmFucwogIHZlcm1leWUgw6dhbMSxxZ90xLFtLl0KYXV0aG9yOiAiRGVybGV5ZW4gW1NlcmRhciBCYWxjxLEsIE1ELCBQYXRob2xvZ2lzdF0oaHR0cHM6Ly9zYmFsY2kuZ2l0aHViLmlvLykiCmluc3RpdHV0ZTogIltzZXJkYXJiYWxjaS5jb21dKGh0dHBzOi8vd3d3LnNlcmRhcmJhbGNpLmNvbSkiCmRhdGU6ICJgciBmb3JtYXQoU3lzLkRhdGUoKSlgIgpvdXRwdXQ6CiAgeGFyaW5nYW46Om1vb25fcmVhZGVyOgogICAgbGliX2RpcjogbGlicwogICAgbmF0dXJlOgogICAgICBiZWZvcmVJbml0OiBbIm1hY3Jvcy5qcyIsICJodHRwczovL3BsYXRmb3JtLnR3aXR0ZXIuY29tL3dpZGdldHMuanMiXQogICAgICBoaWdobGlnaHRTdHlsZTogZ2l0aHViCiAgICAgIGhpZ2hsaWdodExpbmVzOiB0cnVlCiAgICAgIGNvdW50SW5jcmVtZW50YWxTbGlkZXM6IGZhbHNlCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQogIHJldmVhbGpzOjpyZXZlYWxqc19wcmVzZW50YXRpb246CiAgaHRtbF9ub3RlYm9vazoKICAgIGZpZ19jYXB0aW9uOiB5ZXMKICAgIGhpZ2hsaWdodDoga2F0ZQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMKICAgIHRoZW1lOiBmbGF0bHkKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDUKICAgIHRvY19mbG9hdDogeWVzCiAgcGRmX2RvY3VtZW50OgogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogJzUnCiAgaHRtbF9kb2N1bWVudDoKICAgIGZpZ19jYXB0aW9uOiB5ZXMKICAgIGtlZXBfbWQ6IHllcwogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogNQogICAgdG9jX2Zsb2F0OiB5ZXMKZWRpdG9yX29wdGlvbnM6IAogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUKLS0tCgo8IS0tIE9wZW4gYWxsIGxpbmtzIGluIG5ldyB0YWItLT4gIAo8YmFzZSB0YXJnZXQ9Il9ibGFuayIvPiAgIAoKPCEtLSBHbyB0byB3d3cuYWRkdGhpcy5jb20vZGFzaGJvYXJkIHRvIGN1c3RvbWl6ZSB5b3VyIHRvb2xzIC0tPiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvL3M3LmFkZHRoaXMuY29tL2pzLzMwMC9hZGR0aGlzX3dpZGdldC5qcyNwdWJpZD1yYS01YmMzNjkwMGE0MDUwOTBiIj4gIAo8L3NjcmlwdD4KCjwhLS0gWyFbXShodHRwOi8vcmVzLmNsb3VkaW5hcnkuY29tL2R5ZDkxMWttaC9pbWFnZS91cGxvYWQvZl9hdXRvLHFfYXV0bzpiZXN0L3YxNTMwMTEzMDc3L0ltYWdlXzJfdmZ5NDhiLnBuZyldKGh0dHBzOi8vd3d3LmRhdGFjYW1wLmNvbS9jb21tdW5pdHkvdHV0b3JpYWxzL2RhdGEtc2NpZW5jZS1waXRmYWxscykgLS0+CgoKYGBge3Igc2V0dXAgZ2xvYmFsIGNodW5rIHNldHRpbmdzLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoCgltZXNzYWdlID0gRkFMU0UsCgl3YXJuaW5nID0gRkFMU0UsCgljb21tZW50ID0gTkEsCglpbmNsdWRlID0gRkFMU0UsCgl0aWR5ID0gVFJVRQopCmBgYAoKCiMgUiBuZXJlZGUga3VsbGFuxLFsxLFyCgotIFZlcmkgZMO8emVubGVtZQotIMSwc3RhdGlzdGlrIGFuYWxpegotIFdlYiBzYXlmYXPEsSBoYXrEsXJsYW1hIChTdGF0aWsvRGluYW1paykKaHR0cHM6Ly9zYmFsY2kuZ2l0aHViLmlvLyAgCmh0dHBzOi8va2V2aW5ydWUuc2hpbnlhcHBzLmlvL2lzZWUtc2hpbnktY29udGVzdC8KLSBTdW51bSBoYXrEsXJsYW1hIChidSBzdW51bSkKLSBQcm9ncmFtbGFtYQpodHRwczovL3NlcmRhcmJhbGNpLm5ldGxpZnkuY29tL3BhdGh0d2VldHMvCi0gT3RvbWF0aWssIHBlcmlvZGlrIHZlIHRla3JhcmxhbmFiaWxpciByYXBvciBoYXrEsXJsYW1hCmh0dHBzOi8vc2JhbGNpLmdpdGh1Yi5pby9BdXRvSm91cm5hbFdhdGNoL0dhbGxibGFkZGVyUmVjZW50Lmh0bWwKLSBwZGYsIGh0bWwsIHBwdCBvbHXFn3R1cm1hCi0gdGV6IHlhem1hCi0ga2l0YXAgeWF6bWEKLSBDViBvbHXFn3R1cm1hCmh0dHBzOi8vcnB1YnMuY29tL3NiYWxjaS9DViAgIAotIHBvc3RlciBoYXrEsXJsYW1hCi0gcmFwb3IgxZ9hYmxvbnUgb2x1xZ90dXJtYQotIFJvYm90IHV5Z3VsYW1hbGFyxLEgKEFydWRpbm8ga29kdSkKLSAuLi4KCgoKLS0tCgojIFIgZ2VuZXJhdGlvbgoKUiB5xLFsbGFyIGnDp2luZGUgw6dvayBmYXpsYSBkZcSfacWfaW0gZ8O2c3RlcmRpCgpodHRwczovL3Jzcy5vbmxpbmVsaWJyYXJ5LndpbGV5LmNvbS9kb2kvMTAuMTExMS9qLjE3NDAtOTcxMy4yMDE4LjAxMTY5LngKCiFbXShodHRwczovL3dvbC1wcm9kLWNkbi5saXRlcmF0dW1vbmxpbmUuY29tL3BiLWFzc2V0cy9qb3VybmFsLWJhbm5lcnMvMTc0MDk3MTMtMTUwMTM4NDc1NjAzNy5qcGcpCgohWzpzY2FsZSAzMCVdKGh0dHBzOi8vd29sLXByb2QtY2RuLmxpdGVyYXR1bW9ubGluZS5jb20vY21zL2F0dGFjaG1lbnQvMWE0OWMwN2ItYjU2Zi00MzI3LThlOTItNzgyN2VmNTFhN2JiL3NpZ24xMTY5LWdyYS0wMDAyLW0uanBnKQoKCmBgYHtyIGV2YWw9RkFMU0UsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKHBhdGggPSAiaHR0cHM6Ly93b2wtcHJvZC1jZG4ubGl0ZXJhdHVtb25saW5lLmNvbS9jbXMvYXR0YWNobWVudC8xYTQ5YzA3Yi1iNTZmLTQzMjctOGU5Mi03ODI3ZWY1MWE3YmIvc2lnbjExNjktZ3JhLTAwMDItbS5qcGciKQpgYGAKCgotLS0KCiMgUiB5w7xrbGVtZQoKaHR0cDovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PVhjQkxFVmtucXZZCgoKIVtXaGF0IGlzIFI/XShodHRwOi8vaW1nLnlvdXR1YmUuY29tL3ZpL1hjQkxFVmtucXZZLzAuanBnKQoKCi0tLQoKCiMjIFItcHJvamVjdAoKaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvCgotLS0KCiMjIFJTdHVkaW8KCgohW10oaHR0cHM6Ly9pc21heWMuZ2l0aHViLmlvL3RhbGtzL25lc3MtaW5mZXIvaW1nL2VuZ2luZS5wbmcpCgotLS0KCiMjIyBSU3R1ZGlvCgpbaHR0cHM6Ly93d3cucnN0dWRpby5jb20vXShodHRwczovL3d3dy5yc3R1ZGlvLmNvbS8pCgpbaHR0cHM6Ly93d3cucnN0dWRpby5jb20vcHJvZHVjdHMvcnN0dWRpby9kb3dubG9hZC9dKGh0dHBzOi8vd3d3LnJzdHVkaW8uY29tL3Byb2R1Y3RzL3JzdHVkaW8vZG93bmxvYWQvKQoKW2h0dHBzOi8vbW9kZXJuZGl2ZS5jb20vMi1nZXR0aW5nLXN0YXJ0ZWQuaHRtbF0oaHR0cHM6Ly9tb2Rlcm5kaXZlLmNvbS8yLWdldHRpbmctc3RhcnRlZC5odG1sKQoKLS0tCgojIyMgUlN0dWRpbwoKClshW10oaHR0cDovL3d3dy11c2Vycy55b3JrLmFjLnVrL35lcjEzL1JTdHVkaW8lMjBBbmF0b215LnN2ZyldKGh0dHBzOi8vYnV6enJiZWVsaW5lLmJsb2cvMjAxOC8wNy8wNC9yc3R1ZGlvLWFuYXRvbXkvKQoKCgotLS0KCiMjIyBSU3R1ZGlvIGVrbGVudGlsZXJpCgotIERpc2NvdmVyIGFuZCBpbnN0YWxsIHVzZWZ1bCBSU3R1ZGlvIGFkZGlucwoKaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL2FkZGluc2xpc3QvUkVBRE1FLmh0bWwKCmh0dHBzOi8vcnN0dWRpby5naXRodWIuaW8vcnN0dWRpb2FkZGlucy8KCgpgYGAKZGV2dG9vbHM6Omluc3RhbGxfZ2l0aHViKCJyc3R1ZGlvL2FkZGluZXhhbXBsZXMiLCB0eXBlID0gInNvdXJjZSIpCmBgYAoKCi0tLQoKIyMgTWFjT1MgacOnaW4KCiMjIyBYMTEKCmh0dHBzOi8vd3d3LnhxdWFydHoub3JnLwoKIyMjIEphdmEgT1MKCmh0dHBzOi8vc3VwcG9ydC5hcHBsZS5jb20va2IvZGwxNTcyCgotLS0KCgojIFIgem9yIMWfZXlsZXIgacOnaW4ga29sYXksIGtvbGF5IMWfZXlsZXIgacOnaW4gem9yCgoKLSBbUiBtYWtlcyBlYXN5IHRoaW5ncyBoYXJkLCBhbmQgaGFyZCB0aGluZ3MgZWFzeV0oaHR0cDovL3I0c3RhdHMuY29tL2FydGljbGVzL3doeS1yLWlzLWhhcmQtdG8tbGVhcm4vKQoKCi0gQXluxLEgxZ9leWkgw6dvayBmYXpsYSDFn2VraWxkZSB5YXBtYWsgbcO8bWvDvG4KClIgU3ludGF4IENvbXBhcmlzb246OkNIRUFUIFNIRUVUCgpodHRwczovL3d3dy5hbWVsaWEubW4vU3ludGF4LWNoZWF0c2hlZXQucGRmCgoKLS0tCgoKPGJsb2NrcXVvdGUgY2xhc3M9InR3aXR0ZXItdHdlZXQiIGRhdGEtbGFuZz0iZW4iPjxwIGxhbmc9ImVuIiBkaXI9Imx0ciI+PGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9oYXNodGFnL1JTdGF0cz9zcmM9aGFzaCZhbXA7cmVmX3NyYz10d3NyYyU1RXRmdyI+I1JTdGF0czwvYT4g4oCUIFRoZXJlIGFyZSBhbHdheXMgc2V2ZXJhbCB3YXlzIHRvIGRvIHRoZSBzYW1lIHRoaW5nLi4uIG5pY2UgZXhhbXBsZSBvbiB3aXRoIHRoZSBpZGVudGl0eSBtYXRyaXggYnkgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9UZWFTdGF0cz9yZWZfc3JjPXR3c3JjJTVFdGZ3Ij5AVGVhU3RhdHM8L2E+IDxhIGhyZWY9Imh0dHBzOi8vdC5jby9PM0dYZFBpTTMyIj5odHRwczovL3QuY28vTzNHWGRQaU0zMjwvYT48L3A+Jm1kYXNoOyBDb2xpbiBGYXkg8J+kmCAoQF9Db2xpbkZheSkgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9fQ29saW5GYXkvc3RhdHVzLzExMTI3NDY2MzM0Njc1MTg5Nzc/cmVmX3NyYz10d3NyYyU1RXRmdyI+QXByaWwgMSwgMjAxOTwvYT48L2Jsb2NrcXVvdGU+CjxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3BsYXRmb3JtLnR3aXR0ZXIuY29tL3dpZGdldHMuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KCi0tLQoKCiMgUiBwYWtldGxlcmkKCgojIyBOZWRlbiBwYWtldGxlciB2YXIKClshW10oaHR0cHM6Ly9pc21heWMuZ2l0aHViLmlvL3RhbGtzL25lc3MtaW5mZXIvaW1nL2FwcHN0b3JlLnBuZyldKGh0dHBzOi8vaXNtYXljLmdpdGh1Yi5pby90YWxrcy9uZXNzLWluZmVyL3NsaWRlX2RlY2suaHRtbCM3KQoKLS0tCgo8c2NyaXB0IGFzeW5jIHNyYz0iaHR0cHM6Ly9wbGF0Zm9ybS50d2l0dGVyLmNvbS93aWRnZXRzLmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+PGJsb2NrcXVvdGUgY2xhc3M9InR3aXR0ZXItdHdlZXQiIGRhdGEtbGFuZz0iZW4iPjxwIGxhbmc9ImVuIiBkaXI9Imx0ciI+SSBsb3ZlIHRoZSA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL2hhc2h0YWcvcnN0YXRzP3NyYz1oYXNoJmFtcDtyZWZfc3JjPXR3c3JjJTVFdGZ3Ij4jcnN0YXRzPC9hPiBjb21tdW5pdHkuPGJyPlNvbWVvbmUgaXMgbGlrZSwgJnF1b3Q7b2ggaGV5IHBlZXBzLCBJIHNhdyBhIGJpZyBuZWVkIGZvciB0aGlzIG11bmRhbmUgYnV0IGRpZmZpY3VsdCB0YXNrIHRoYXQgSSBpbmZyZXF1ZW50bHkgZG8sIHNvIEkgY3JlYXRlZCBhIHBhY2thZ2UgdGhhdCB3aWxsIGxpdGVyYWxseSBzY3JhcGUgdGhlIGxhc3QgYml0cyBvZiBwZWFudXQgYnV0dGVyIG91dCBvZiB0aGUgamFyIGZvciB5b3UuIEl0JiMzOTtzIGNhbGxlZCBwYnBseXIuJnF1b3Q7PGJyPldoYXQgYSB0cmliZS48L3A+Jm1kYXNoOyBGcmFuayBFbGF2c2t5IOG0sOG1g+G1l+G1gyDhtYLhtqbhtrvhtYPKs+G1iCAoQEZyYW5rbHlfRGF0YSkgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9GcmFua2x5X0RhdGEvc3RhdHVzLzEwMTQxODkwOTUyOTQyOTE5Njg/cmVmX3NyYz10d3NyYyU1RXRmdyI+SnVseSAzLCAyMDE4PC9hPjwvYmxvY2txdW90ZT4KCjwhLS0gLS0tIC0tPgoKPCEtLSBodHRwczovL2Jsb2cubWl0Y2hlbGxvaGFyYXdpbGQuY29tL2Jsb2cvdXNlci0yMDE4LWZlYXR1cmUtd2FsbC8gLS0+CgotLS0KCiFbXShodHRwczovL2Jsb2cubWl0Y2hlbGxvaGFyYXdpbGQuY29tL2Jsb2cvMjAxOC0wNy0xMS11c2VyLTIwMTgtZmVhdHVyZS13YWxsX2ZpbGVzL2ZpbmFsLmpwZykKCi0tLQoKIyMgUGFrZXRsZXJpIG5lcmVkZW4gYnVsYWJpbGlyaXoKCi0gQXZhaWxhYmxlIENSQU4gUGFja2FnZXMgQnkgTmFtZSAgCmh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9hdmFpbGFibGVfcGFja2FnZXNfYnlfbmFtZS5odG1sCgotIENSQU4gVGFzayBWaWV3cyAgCmh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi92aWV3cy8KCi0gQmlvY29uZHVjdG9yICAKaHR0cHM6Ly93d3cuYmlvY29uZHVjdG9yLm9yZwoKLSBSZWNvbW1lbmRSICAKaHR0cDovL3JlY29tbWVuZHIuaW5mby8KCi0gcGtnc2VhcmNoICAKQ1JBTiBwYWNrYWdlIHNlYXJjaCAgCmh0dHBzOi8vZ2l0aHViLmNvbS9tZXRhY3Jhbi9wa2dzZWFyY2gKCi0gQ1JBTnNlYXJjaGVyICAKaHR0cHM6Ly9naXRodWIuY29tL1Job0luYy9DUkFOc2VhcmNoZXIgIAoKLSBBd2Vzb21lIFIgIApodHRwczovL2F3ZXNvbWUtci5jb20vICAKCi0tLQoKIyMgS2VuZGkgcGFrZXQgZXZyZW5pbmkgb2x1xZ90dXIKCi0gcGtndmVyc2U6IEJ1aWxkIGEgTWV0YS1QYWNrYWdlIFVuaXZlcnNlICAKaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL3BrZ3ZlcnNlL2luZGV4Lmh0bWwKCgotLS0KCiMjIFIgcGFrZXQgecO8a2xlbWUKCmBgYAppbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dmVyc2UiLCBkZXBlbmRlbmNpZXMgPSBUUlVFKQppbnN0YWxsLnBhY2thZ2VzKCJqbXYiLCBkZXBlbmRlbmNpZXMgPSBUUlVFKQppbnN0YWxsLnBhY2thZ2VzKCJxdWVzdGlvbnIiLCBkZXBlbmRlbmNpZXMgPSBUUlVFKQppbnN0YWxsLnBhY2thZ2VzKCJSY21kciIsIGRlcGVuZGVuY2llcyA9IFRSVUUpCmluc3RhbGwucGFja2FnZXMoInN1bW1hcnl0b29scyIpCmBgYAoKYGBge3IgcGFrZXQgecO8a2xlbWV9CiMgaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIiwgZGVwZW5kZW5jaWVzID0gVFJVRSkKIyBpbnN0YWxsLnBhY2thZ2VzKCJqbXYiLCBkZXBlbmRlbmNpZXMgPSBUUlVFKQojIGluc3RhbGwucGFja2FnZXMoInF1ZXN0aW9uciIsIGRlcGVuZGVuY2llcyA9IFRSVUUpCiMgaW5zdGFsbC5wYWNrYWdlcygiUmNtZHIiLCBkZXBlbmRlbmNpZXMgPSBUUlVFKQojIGluc3RhbGwucGFja2FnZXMoInN1bW1hcnl0b29scyIpCmBgYAoKLS0tCgojIyBQYWtldCDDp2HEn8Sxcm1hCgpgYGB7ciBwYWtldCBjYWdpcm1hLCBlcnJvcj1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGV2YWwgPSBUUlVFLCBpbmNsdWRlID0gVFJVRX0KIyByZXF1aXJlKHRpZHl2ZXJzZSkgIAojIHJlcXVpcmUoam12KSAgCiMgcmVxdWlyZShxdWVzdGlvbnIpICAKIyBsaWJyYXJ5KHN1bW1hcnl0b29scykgIAojIGxpYnJhcnkoZ2dhbmltYXRlKSAgCmBgYAoKCgotLS0KCiMgUiBpw6dpbiB5YXJkxLFtIGJ1bG1hCgoKYGBge3IgeWFyZMSxbSwgZWNobz1UUlVFfQojID9tZWFuCiMgPz9lZmV0Y2gKIyBoZWxwKG1lcmdlKQojIGV4YW1wbGUobWVyZ2UpCmBgYAoKLS0tCgotIFZpZ25ldHRlCgohWzpzY2FsZSA4MCVdKGZpZ3VyZXMvdmlnbmV0dGUucG5nKQoKLS0tCgotIFJEb2N1bWVudGF0aW9uCmh0dHBzOi8vd3d3LnJkb2N1bWVudGF0aW9uLm9yZwoKLSBSIFBhY2thZ2UgRG9jdW1lbnRhdGlvbgpodHRwczovL3JkcnIuaW8vCgotIEdpdEh1YgoKLSBTdGFja292ZXJmbG93CgpodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tLwoKLSBHb29nbGUgdXlndW4gYW5haHRhciBrZWxpbWUKCi0tLQoKPHNjcmlwdCBhc3luYyBzcmM9Imh0dHBzOi8vcGxhdGZvcm0udHdpdHRlci5jb20vd2lkZ2V0cy5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PjxibG9ja3F1b3RlIGNsYXNzPSJ0d2l0dGVyLXR3ZWV0IiBkYXRhLWxhbmc9ImVuIj48cCBsYW5nPSJlbiIgZGlyPSJsdHIiPkhvdyBJIHVzZSA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL2hhc2h0YWcvcnN0YXRzP3NyYz1oYXNoJmFtcDtyZWZfc3JjPXR3c3JjJTVFdGZ3Ij4jcnN0YXRzPC9hPiA8YnI+aC90IDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vVGhlUHJhY3RpY2FsRGV2P3JlZl9zcmM9dHdzcmMlNUV0ZnciPkBUaGVQcmFjdGljYWxEZXY8L2E+IDxhIGhyZWY9Imh0dHBzOi8vdC5jby9lclJuVEcwVWpyIj5waWMudHdpdHRlci5jb20vZXJSblRHMFVqcjwvYT48L3A+Jm1kYXNoOyBFbWlseSBCb3ZlZSAoQGVib3ZlZTA5KSA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL2Vib3ZlZTA5L3N0YXR1cy8xMDI4MDM3NTk0OTQ3NDg1Njk2P3JlZl9zcmM9dHdzcmMlNUV0ZnciPkF1Z3VzdCAxMCwgMjAxODwvYT48L2Jsb2NrcXVvdGU+CgoKLS0tCgoKIVtdKGZpZ3VyZXMvR29vZ2xlLXBhY2thZ2UtbmFtZS5wbmcpCgotLS0KCgoKIVtdKGZpZ3VyZXMvR29vZ2xlLXN0YXJ0LXdpdGgtUi5wbmcpCgoKLSBHb29nbGUnZGEgYXJhcmtlbiBgW1JdYCB5YXptYWsgZGEgacWfZSB5YXJheWFiaWxpeW9yLgoKCi0tLQoKLSBzZWFyY2hlciBwYWNrYWdlIPCfk6YKCgpbIVtdKGh0dHBzOi8vY2Ftby5naXRodWJ1c2VyY29udGVudC5jb20vMTJmMGUyZDE4MDQ3ZjFiNWYzNmZiZWIwOWExZDBlNTQ4MjM2ODgzZi82ODc0NzQ3MDczM2EyZjJmNjkyZTY5NmQ2Nzc1NzIyZTYzNmY2ZDJmNWE3MTMyNzI2NzM2NDcyZTY3Njk2NildKGh0dHBzOi8vZ2l0aHViLmNvbS9jb2F0bGVzcy9zZWFyY2hlcikKCgoKLS0tCgotIEF3ZXNvbWUgQ2hlYXRzaGVldApodHRwczovL2dpdGh1Yi5jb20vZGV0YWlseWFuZy9hd2Vzb21lLWNoZWF0c2hlZXQKCmh0dHA6Ly9jcmFuLnItcHJvamVjdC5vcmcvZG9jL2NvbnRyaWIvQmFnZ290dC1yZWZjYXJkLXYyLnBkZgoKaHR0cHM6Ly93d3cucnN0dWRpby5jb20vcmVzb3VyY2VzL2NoZWF0c2hlZXRzLwoKCi0gQXdlc29tZSBSCgpodHRwczovL2dpdGh1Yi5jb20vcWlud2YvYXdlc29tZS1SI3JlYWRtZQoKaHR0cHM6Ly9hd2Vzb21lLXIuY29tLwoKCi0gVHdpdHRlcgoKaHR0cHM6Ly90d2l0dGVyLmNvbS9oYXNodGFnL3JzdGF0cz9zcmM9aGFzaAoKLS0tCgoKLSBVc2UgUmVwcm9kdWNpYmxlIEV4YW1wbGVzIFdoZW4gQXNraW5nICAKCjxibG9ja3F1b3RlIGNsYXNzPSJ0d2l0dGVyLXR3ZWV0IiBkYXRhLWxhbmc9ImVuIj48cCBsYW5nPSJlbiIgZGlyPSJsdHIiPkdvdCBhIHF1ZXN0aW9uIHRvIGFzayBvbiA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL1NsYWNrSFE/cmVmX3NyYz10d3NyYyU1RXRmdyI+QFNsYWNrSFE8L2E+IG9yIHBvc3Qgb24gPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9naXRodWI/cmVmX3NyYz10d3NyYyU1RXRmdyI+QGdpdGh1YjwvYT4/IE5vIHRpbWUgdG8gcmVhZCB0aGUgbG9uZyBwb3N0IG9uIGhvdyB0byB1c2UgcmVwcmV4PyBIZXJlIGlzIGEgMjAtc2Vjb25kIGdpZiBmb3IgeW91IHRvIGZvcm1hdCB5b3VyIFIgY29kZXMgbmljZWx5IGFuZCBmb3Igb3RoZXJzIHRvIHJlcHJvZHVjZSB5b3VyIHByb2JsZW0uIChBbiBleGFtcGxlIGZyb20gYSB0YWxrIGdpdmVuIGJ5IDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vSmVubnlCcnlhbj9yZWZfc3JjPXR3c3JjJTVFdGZ3Ij5ASmVubnlCcnlhbjwvYT4pIDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vaGFzaHRhZy9yc3RhdD9zcmM9aGFzaCZhbXA7cmVmX3NyYz10d3NyYyU1RXRmdyI+I3JzdGF0PC9hPiA8YSBocmVmPSJodHRwczovL3QuY28vZ3B1R1hwRklzWCI+cGljLnR3aXR0ZXIuY29tL2dwdUdYcEZJc1g8L2E+PC9wPiZtZGFzaDsgWmhpWWFuZyAoQHpoaWlpeWFuZykgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS96aGlpaXlhbmcvc3RhdHVzLzEwNTMwMDYwMDM3MTE1Njk5MjA/cmVmX3NyYz10d3NyYyU1RXRmdyI+T2N0b2JlciAxOCwgMjAxODwvYT48L2Jsb2NrcXVvdGU+PHNjcmlwdCBhc3luYyBzcmM9Imh0dHBzOi8vcGxhdGZvcm0udHdpdHRlci5jb20vd2lkZ2V0cy5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgoKCi0gS2VlcGluZyB1cCB0byBkYXRlIHdpdGggUiBuZXdzICAKaHR0cHM6Ly9tYXNhbG1vbi5ldS8yMDE5LzAxLzI1L3VwdG9kYXRlLyAgCgotLS0KCiMgUnN0dWRpbyBpbGUgcHJvamUgb2x1xZ90dXJtYQoKaHR0cHM6Ly9zdXBwb3J0LnJzdHVkaW8uY29tL2hjL2VuLXVzL2FydGljbGVzLzIwMDUyNjIwNy1Vc2luZy1Qcm9qZWN0cwoKIVtdKGh0dHA6Ly93d3cucnN0dWRpby5jb20vaW1hZ2VzL2RvY3MvcHJvamVjdHNfbmV3LnBuZykKCi0tLQoKIyBSU3R1ZGlvIGlsZSB2ZXJpIHnDvGtsZW1lCgpodHRwczovL3N1cHBvcnQucnN0dWRpby5jb20vaGMvZW4tdXMvYXJ0aWNsZXMvMjE4NjExOTc3LUltcG9ydGluZy1EYXRhLXdpdGgtUlN0dWRpbwoKIVtdKGh0dHBzOi8vc3VwcG9ydC5yc3R1ZGlvLmNvbS9oYy9lbi11cy9hcnRpY2xlX2F0dGFjaG1lbnRzLzIwNjI3NzYxOC9kYXRhLWltcG9ydC1vdmVydmlldy5naWYpCgotLS0KCiMjIEV4Y2VsCgojIyBTUFNTCgojIyBDU1YKCgotLS0KCiMgVmVyaXlpIGfDtnLDvG50w7xsZW1lCgo8c2NyaXB0IGFzeW5jIHNyYz0iaHR0cHM6Ly9wbGF0Zm9ybS50d2l0dGVyLmNvbS93aWRnZXRzLmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+PGJsb2NrcXVvdGUgY2xhc3M9InR3aXR0ZXItdHdlZXQiIGRhdGEtbGFuZz0iZW4iPjxwIGxhbmc9ImVuIiBkaXI9Imx0ciI+U3ByZWFkc2hlZXQgdXNlcnMgdXNpbmcgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9oYXNodGFnL3JzdGF0cz9zcmM9aGFzaCZhbXA7cmVmX3NyYz10d3NyYyU1RXRmdyI+I3JzdGF0czwvYT46ICB3aGVyZSYjMzk7cyB0aGUgZGF0YT88YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL2hhc2h0YWcvcnN0YXRzP3NyYz1oYXNoJmFtcDtyZWZfc3JjPXR3c3JjJTVFdGZ3Ij4jcnN0YXRzPC9hPiB1c2VycyB1c2luZyBzcHJlYWRzaGVldHM6ICB3aGVyZSYjMzk7cyB0aGUgY29kZT88L3A+Jm1kYXNoOyBMZW9uYXJkIEtpZWZlciAoQGxlbmtpZWZlcikgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9sZW5raWVmZXIvc3RhdHVzLzEwMTU1ODc0NzU1ODA5NTY2NzI/cmVmX3NyYz10d3NyYyU1RXRmdyI+SnVseSA3LCAyMDE4PC9hPjwvYmxvY2txdW90ZT4KCi0tLQoKIyBWZXJpeWkgZ8O2csO8bnTDvGxlbWUKCmBgYHtyLCByZXN1bHRzPSJtYXJrdXAifQojIGxpYnJhcnkobnljZmxpZ2h0czEzKQojIHN1bW1hcnkoZmxpZ2h0cykKYGBgCgoKCmBgYApWaWV3KGRhdGEpCmBgYAoKCmBgYApkYXRhCmBgYAoKCmBgYApoZWFkCmBgYAoKCmBgYAp0YWlsCmBgYAoKCmBgYApnbGltcHNlCmBgYAoKCmBgYApzdHIKYGBgCgoKYGBgCnNraW1yOjpza2ltKCkKYGBgCgotLS0KCgojIFZlcml5aSBkZcSfacWfdGlybWUKCiMjIFZlcml5aSBrb2QgaWxlIGRlxJ9pxZ90aXJlbGltCgojIyBWZXJpeWkgZWtsZW50aWxlcmxlIGRlxJ9pxZ90aXJtZQoKIVs6c2NhbGUgMzAlXShmaWd1cmVzL2NoYW5nZV9kYXRhLnBuZykKCgotLS0KCgojIyBSU3R1ZGlvIGFyYWPEsWzEscSfxLF5bGEgcmVjb2RlCgoqcXVlc3Rpb25yKiBwYWtldGkga3VsbGFuxLFsYWNhawoKIVs6c2NhbGUgMzAlXShmaWd1cmVzL2xldmVsX3JlY29kZS5wbmcpCgoKLS0tCgoKCmh0dHBzOi8vanViYS5naXRodWIuaW8vcXVlc3Rpb25yL2FydGljbGVzL3JlY29kaW5nX2FkZGlucy5odG1sCgoKIVtdKGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9qdWJhL3F1ZXN0aW9uci9tYXN0ZXIvcmVzb3VyY2VzL3NjcmVlbnNob3RzL2lyZWNfMS5wbmcpCgoKLS0tCgohW10oaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2p1YmEvcXVlc3Rpb25yL21hc3Rlci9yZXNvdXJjZXMvc2NyZWVuc2hvdHMvaXJlY18yLnBuZykKCgotLS0KCiFbXShodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vanViYS9xdWVzdGlvbnIvbWFzdGVyL3Jlc291cmNlcy9zY3JlZW5zaG90cy9pcmVjXzMucG5nKQoKCi0tLQoKIyBCYXNpdCB0YW7EsW1sYXnEsWPEsSBpc3RhdGlzdGlrbGVyCgpgYGAKc3VtbWFyeSgpCmBgYAoKYGBgCm1lYW4KYGBgCgpgYGAKbWVkaWFuCmBgYAoKYGBgCm1pbgpgYGAKCmBgYAptYXgKYGBgCgpgYGAKc2QKYGBgCgpgYGAKdGFibGUoKQpgYGAKCi0tLQoKCmBgYHtyIGRlc2NyaXB0aXZlLCBlY2hvPVRSVUUsIGluY2x1ZGUgPSBUUlVFfQpsaWJyYXJ5KHJlYWRyKQppcmlzZGF0YSA8LSByZWFkX2NzdigiZGF0YS9pcmlzLmNzdiIpCgpqbXY6OmRlc2NyaXB0aXZlcygKICAgIGRhdGEgPSBpcmlzZGF0YSwKICAgIHZhcnMgPSAiU2VwYWwuTGVuZ3RoIiwKICAgIHNwbGl0QnkgPSAiU3BlY2llcyIsCiAgICBmcmVxID0gVFJVRSwKICAgIGhpc3QgPSBUUlVFLAogICAgZGVucyA9IFRSVUUsCiAgICBiYXIgPSBUUlVFLAogICAgYm94ID0gVFJVRSwKICAgIHZpb2xpbiA9IFRSVUUsCiAgICBkb3QgPSBUUlVFLAogICAgbW9kZSA9IFRSVUUsCiAgICBzdW0gPSBUUlVFLAogICAgc2QgPSBUUlVFLAogICAgdmFyaWFuY2UgPSBUUlVFLAogICAgcmFuZ2UgPSBUUlVFLAogICAgc2UgPSBUUlVFLAogICAgc2tldyA9IFRSVUUsCiAgICBrdXJ0ID0gVFJVRSwKICAgIHF1YXJ0ID0gVFJVRSwKICAgIHBjRXFHciA9IFRSVUUpCmBgYAoKLS0tCgpgYGB7ciBzY2F0dGVyLCBlY2hvPVRSVUUsIGluY2x1ZGU9VFJVRX0KIyBpbnN0YWxsLnBhY2thZ2VzKCJzY2F0ciIpCnNjYXRyOjpzY2F0KAogICAgZGF0YSA9IGlyaXNkYXRhLAogICAgeCA9ICJTZXBhbC5MZW5ndGgiLAogICAgeSA9ICJTZXBhbC5XaWR0aCIsCiAgICBncm91cCA9ICJTcGVjaWVzIiwKICAgIG1hcmcgPSAiZGVucyIsCiAgICBsaW5lID0gImxpbmVhciIsCiAgICBzZSA9IFRSVUUpCmBgYAoKLS0tCgojIyBzdW1tYXJ5dG9vbHMKCmh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9zdW1tYXJ5dG9vbHMvdmlnbmV0dGVzL0ludHJvZHVjdGlvbi5odG1sCgpgYGB7ciwgaW5jbHVkZT1UUlVFLCBjb21tZW50PU5BLCBwcm9tcHQ9RkFMU0UsIGNhY2hlPUZBTFNFLCBlY2hvPVRSVUUsIHJlc3VsdHM9J2FzaXMnfQpsaWJyYXJ5KHN1bW1hcnl0b29scykKc3VtbWFyeXRvb2xzOjpmcmVxKGlyaXMkU3BlY2llcywgc3R5bGUgPSAicm1hcmtkb3duIikKYGBgCgoKLS0tCgpgYGB7ciwgaW5jbHVkZT1UUlVFLCBjb21tZW50PU5BLCBwcm9tcHQ9RkFMU0UsIGNhY2hlPUZBTFNFLCBlY2hvPVRSVUUsIHJlc3VsdHM9J2FzaXMnfQpzdW1tYXJ5dG9vbHM6OmZyZXEoaXJpcyRTcGVjaWVzLCByZXBvcnQubmFzID0gRkFMU0UsIHN0eWxlID0gInJtYXJrZG93biIsIGhlYWRpbmdzID0gRkFMU0UpCmBgYAoKCi0tLQoKCmBgYHtyLCBpbmNsdWRlPVRSVUUsIGNvbW1lbnQ9TkEsIHByb21wdD1GQUxTRSwgY2FjaGU9RkFMU0UsIGVjaG89VFJVRSwgcmVzdWx0cz0nYXNpcyd9CndpdGgodG9iYWNjbywgcHJpbnQoY3RhYmxlKHNtb2tlciwgZGlzZWFzZWQpLCBtZXRob2QgPSAncmVuZGVyJykpCmBgYAoKCi0tLQoKCmBgYHtyLCBpbmNsdWRlPVRSVUUsIGNvbW1lbnQ9TkEsIHByb21wdD1GQUxTRSwgY2FjaGU9RkFMU0UsIGVjaG89VFJVRSwgcmVzdWx0cz0nYXNpcyd9CndpdGgodG9iYWNjbywKICAgICBwcmludChjdGFibGUoc21va2VyLCBkaXNlYXNlZCwgcHJvcCA9ICduJywgdG90YWxzID0gRkFMU0UpLAogICAgICAgICAgIG9taXQuaGVhZGluZ3MgPSBUUlVFLCBtZXRob2QgPSAicmVuZGVyIikpCmBgYAoKLS0tCgpgYGB7ciwgaW5jbHVkZT1UUlVFLCBjb21tZW50PU5BLCBwcm9tcHQ9RkFMU0UsIGNhY2hlPUZBTFNFLCBlY2hvPVRSVUUsIHJlc3VsdHM9J2FzaXMnfQpzdW1tYXJ5dG9vbHM6OmRlc2NyKGlyaXMsIHN0eWxlID0gInJtYXJrZG93biIpCmBgYAoKLS0tCgpgYGB7ciwgaW5jbHVkZT1UUlVFLCBjb21tZW50PU5BLCBwcm9tcHQ9RkFMU0UsIGNhY2hlPUZBTFNFLCBlY2hvPVRSVUUsIHJlc3VsdHM9J2FzaXMnfQpkZXNjcihpcmlzLAogICAgICBzdGF0cyA9IGMoIm1lYW4iLCAic2QiLCAibWluIiwgIm1lZCIsICJtYXgiKSwKICAgICAgdHJhbnNwb3NlID0gVFJVRSwKICAgICAgaGVhZGluZ3MgPSBGQUxTRSwKICAgICAgc3R5bGUgPSAicm1hcmtkb3duIikKYGBgCgotLS0KCmBgYHtyLCBpbmNsdWRlPVRSVUUsIGNvbW1lbnQ9TkEsIHByb21wdD1GQUxTRSwgY2FjaGU9RkFMU0UsIGVjaG89VFJVRSwgcmVzdWx0cz0nYXNpcyd9CiMgdmlldyhkZlN1bW1hcnkoaXJpcykpCgpgYGAKCgohW10oZmlndXJlcy9kZnN1bW1hcnkucG5nKQoKPCEtLSAtLS0gLS0+Cgo8IS0tIGBgYHtyLCBpbmNsdWRlPVRSVUUsIGNvbW1lbnQ9TkEsIHByb21wdD1GQUxTRSwgY2FjaGU9RkFMU0UsIGVjaG89VFJVRSwgcmVzdWx0cz0nYXNpcyd9IC0tPgo8IS0tIGRmU3VtbWFyeSh0b2JhY2NvLCAtLT4KPCEtLSAgICAgICAgICAgcGxhaW4uYXNjaWkgPSBGQUxTRSwgLS0+CjwhLS0gICAgICAgICAgIHN0eWxlID0gImdyaWQiKSAtLT4KPCEtLSBgYGAgLS0+CgoKLS0tCgpgYGB7ciwgaW5jbHVkZT1UUlVFLCBjb21tZW50PU5BLCBwcm9tcHQ9RkFMU0UsIGNhY2hlPUZBTFNFLCBlY2hvPVRSVUUsIHJlc3VsdHM9J2FzaXMnfQojIEZpcnN0IHNhdmUgdGhlIHJlc3VsdHMKaXJpc19zdGF0c19ieV9zcGVjaWVzIDwtIGJ5KGRhdGEgPSBpcmlzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5ESUNFUyA9IGlyaXMkU3BlY2llcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZVTiA9IGRlc2NyLCBzdGF0cyA9IGMoIm1lYW4iLCAic2QiLCAibWluIiwgIm1lZCIsICJtYXgiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9zZSA9IFRSVUUpCiMgVGhlbiB1c2UgdmlldygpLCBsaWtlIHNvOgp2aWV3KGlyaXNfc3RhdHNfYnlfc3BlY2llcywgbWV0aG9kID0gInBhbmRlciIsIHN0eWxlID0gInJtYXJrZG93biIpCmBgYAoKCi0tLQoKCmBgYHtyLCBpbmNsdWRlPVRSVUUsIGNvbW1lbnQ9TkEsIHByb21wdD1GQUxTRSwgY2FjaGU9RkFMU0UsIGVjaG89VFJVRSwgcmVzdWx0cz0nYXNpcyd9CiMgdmlldyhpcmlzX3N0YXRzX2J5X3NwZWNpZXMpCmBgYAoKIVtdKGZpZ3VyZXMvRGVzY3JpcHRpdmVTdGF0aXN0aWNzLnBuZykKCi0tLQoKYGBge3IsIGluY2x1ZGU9VFJVRSwgY29tbWVudD1OQSwgcHJvbXB0PUZBTFNFLCBjYWNoZT1GQUxTRSwgZWNobz1UUlVFLCByZXN1bHRzPSdhc2lzJ30KZGF0YSh0b2JhY2NvKSAjIHRvYmFjY28gaXMgYW4gZXhhbXBsZSBkYXRhZnJhbWUgaW5jbHVkZWQgaW4gdGhlIHBhY2thZ2UKQk1JX2J5X2FnZSA8LSB3aXRoKHRvYmFjY28sCiAgICAgICAgICAgICAgICAgICBieShCTUksIGFnZS5nciwgZGVzY3IsCiAgICAgICAgICAgICAgICAgICAgICBzdGF0cyA9IGMoIm1lYW4iLCAic2QiLCAibWluIiwgIm1lZCIsICJtYXgiKSkpCnZpZXcoQk1JX2J5X2FnZSwgInBhbmRlciIsIHN0eWxlID0gInJtYXJrZG93biIpCmBgYAoKLS0tCgpgYGB7ciwgaW5jbHVkZT1UUlVFLCBjb21tZW50PU5BLCBwcm9tcHQ9RkFMU0UsIGNhY2hlPUZBTFNFLCBlY2hvPVRSVUUsIHJlc3VsdHM9J2FzaXMnfQpCTUlfYnlfYWdlIDwtIHdpdGgodG9iYWNjbywKICAgICAgICAgICAgICAgICAgIGJ5KEJNSSwgYWdlLmdyLCBkZXNjciwgIHRyYW5zcG9zZSA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICBzdGF0cyA9IGMoIm1lYW4iLCAic2QiLCAibWluIiwgIm1lZCIsICJtYXgiKSkpCgp2aWV3KEJNSV9ieV9hZ2UsICJwYW5kZXIiLCBzdHlsZSA9ICJybWFya2Rvd24iLCBvbWl0LmhlYWRpbmdzID0gVFJVRSkKYGBgCgo8IS0tIC0tLSAtLT4KCjwhLS0gYGBge3IsIGluY2x1ZGU9VFJVRSwgY29tbWVudD1OQSwgcHJvbXB0PUZBTFNFLCBjYWNoZT1GQUxTRSwgZWNobz1UUlVFLCByZXN1bHRzPSdhc2lzJ30gLS0+CjwhLS0gdG9iYWNjb19zdWJzZXQgPC0gdG9iYWNjb1sgLGMoImdlbmRlciIsICJhZ2UuZ3IiLCAic21va2VyIildIC0tPgo8IS0tIGZyZXFfdGFibGVzIDwtIGxhcHBseSh0b2JhY2NvX3N1YnNldCwgZnJlcSkgLS0+Cgo8IS0tICMgdmlldyhmcmVxX3RhYmxlcywgZm9vdG5vdGUgPSBOQSwgZmlsZSA9ICdmcmVxLXRhYmxlcy5odG1sJykgLS0+CjwhLS0gYGBgIC0tPgoKLS0tCgpgYGB7ciwgaW5jbHVkZT1UUlVFLCBjb21tZW50PU5BLCBwcm9tcHQ9RkFMU0UsIGNhY2hlPUZBTFNFLCBlY2hvPVRSVUUsIHJlc3VsdHM9J2FzaXMnfQp3aGF0LmlzKGlyaXMpCmBgYAoKPCEtLSAtLS0gLS0+Cgo8IS0tIGBgYHtyfSAtLT4KPCEtLSBmcmVxKHRvYmFjY28kZ2VuZGVyLCBzdHlsZSA9ICdybWFya2Rvd24nKSAtLT4KPCEtLSBgYGAgLS0+Cgo8IS0tIC0tLSAtLT4KCjwhLS0gYGBge3J9IC0tPgo8IS0tIHByaW50KGZyZXEodG9iYWNjbyRnZW5kZXIpLCBtZXRob2QgPSAncmVuZGVyJykgLS0+CjwhLS0gYGBgIC0tPgoKPCEtLSAtLS0gLS0+Cgo8IS0tICMjIHNraW1yIC0tPgoKPCEtLSBgYGAgLS0+CjwhLS0gbGlicmFyeShza2ltcikgLS0+CjwhLS0gc2tpbShkZikgLS0+CjwhLS0gYGBgIC0tPgoKLS0tCgojIyBEYXRhRXhwbG9yZXIKCmBgYApsaWJyYXJ5KERhdGFFeHBsb3JlcikKRGF0YUV4cGxvcmVyOjpjcmVhdGVfcmVwb3J0KGRmKQpgYGAKCgpbIVtdKGh0dHBzOi8vc3RhdGljMS5zcXVhcmVzcGFjZS5jb20vc3RhdGljLzU4ZWVmODg0NmE0OTYzZTQyOTY4N2E0ZC90LzViZGZjMmZiNGQ3YTljMDRlZTUwYjdhYS8xNTQxMzkxMTYwNzAyL2RhdGFFeHBsb3JlckdpZkxnLmdpZj9mb3JtYXQ9MTUwMHcpXShodHRwczovL3d3dy5saXR0bGVtaXNzZGF0YS5jb20vYmxvZy9zaW1wbGUtZWRhKQoKCgotLS0KCiMjIGluc3BlY3RkZgoKaHR0cHM6Ly9naXRodWIuY29tL2FsYXN0YWlycnVzaHdvcnRoL2luc3BlY3RkZgoKCi0tLQoKIyMgR3JhZmlrbGVyCgpgYGB7ciBlY2hvPVRSVUV9CiMgbGlicmFyeShnZ3Bsb3QyKQojIGxpYnJhcnkobW9zYWljKQojIG1QbG90KGlyaXNkYXRhKQpgYGAKCjwhLS0gLS0tIC0tPgoKCjwhLS0gYGBge3IsIHJlc3VsdHM9ImFzaXMifSAtLT4KPCEtLSBjdGFibGUodG9iYWNjbyRnZW5kZXIsIHRvYmFjY28kc21va2VyLCBzdHlsZSA9ICdybWFya2Rvd24nKSAtLT4KPCEtLSBgYGAgLS0+Cgo8IS0tIC0tLSAtLT4KCgo8IS0tIGBgYHtyfSAtLT4KPCEtLSBwcmludChjdGFibGUodG9iYWNjbyRnZW5kZXIsIHRvYmFjY28kc21va2VyKSwgbWV0aG9kID0gJ3JlbmRlcicpIC0tPgo8IS0tIGBgYCAtLT4KCgo8IS0tIC0tLSAtLT4KCmBgYApkZXNjcih0b2JhY2NvLCBzdHlsZSA9ICdybWFya2Rvd24nKQoKcHJpbnQoZGVzY3IodG9iYWNjbyksIG1ldGhvZCA9ICdyZW5kZXInLCB0YWJsZS5jbGFzc2VzID0gJ3N0LXNtYWxsJykKCmRmU3VtbWFyeSh0b2JhY2NvLCBzdHlsZSA9ICdncmlkJywgcGxhaW4uYXNjaWkgPSBGQUxTRSkKCnByaW50KGRmU3VtbWFyeSh0b2JhY2NvLCBncmFwaC5tYWduaWYgPSAwLjc1KSwgbWV0aG9kID0gJ3JlbmRlcicpCmBgYAoKCi0tLQoKCgo8YmxvY2txdW90ZSBjbGFzcz0idHdpdHRlci10d2VldCIgZGF0YS1sYW5nPSJlbiI+PHAgbGFuZz0iZW4iIGRpcj0ibHRyIj5IZXJlLCBidWlsZGluZyB1cCBhIDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vaGFzaHRhZy9nZ3Bsb3QyP3NyYz1oYXNoJmFtcDtyZWZfc3JjPXR3c3JjJTVFdGZ3Ij4jZ2dwbG90MjwvYT4gYXMgc2xvd2x5IGFzIHBvc3NpYmxlLCA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL2hhc2h0YWcvcnN0YXRzP3NyYz1oYXNoJmFtcDtyZWZfc3JjPXR3c3JjJTVFdGZ3Ij4jcnN0YXRzPC9hPi4gIEluY3JlbWVudGFsIGFkanVzdG1lbnRzLiAgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9oYXNodGFnL3JzdGF0c3RlYWNoaW5naWRlYXM/c3JjPWhhc2gmYW1wO3JlZl9zcmM9dHdzcmMlNUV0ZnciPiNyc3RhdHN0ZWFjaGluZ2lkZWFzPC9hPiA8YSBocmVmPSJodHRwczovL3QuY28vblV1bFFsOGJQaCI+cGljLnR3aXR0ZXIuY29tL25VdWxRbDhiUGg8L2E+PC9wPiZtZGFzaDsgR2luYSBSZXlub2xkcyAoQEV2YU1hZVJleSkgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9FdmFNYWVSZXkvc3RhdHVzLzEwMjkxMDQ2NTY3NjM1NzIyMjY/cmVmX3NyYz10d3NyYyU1RXRmdyI+QXVndXN0IDEzLCAyMDE4PC9hPjwvYmxvY2txdW90ZT48c2NyaXB0IGFzeW5jIHNyYz0iaHR0cHM6Ly9wbGF0Zm9ybS50d2l0dGVyLmNvbS93aWRnZXRzLmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CgoKLS0tCgoKWyFbXShodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZHJlYW1Scy9lc3F1aXNzZS9tYXN0ZXIvbWFuL2ZpZ3VyZXMvZXNxdWlzc2UuZ2lmKV0oaHR0cHM6Ly9naXRodWIuY29tL2RyZWFtUnMvZXNxdWlzc2UpCgoKPGJsb2NrcXVvdGUgY2xhc3M9InR3aXR0ZXItdHdlZXQiIGRhdGEtbGFuZz0iZW4iPjxwIGxhbmc9ImVuIiBkaXI9Imx0ciI+RHJlYW1pbmcgb2YgYSBmYW5jeSA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL2hhc2h0YWcvUnN0YXRzP3NyYz1oYXNoJmFtcDtyZWZfc3JjPXR3c3JjJTVFdGZ3Ij4jUnN0YXRzPC9hPiA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL2hhc2h0YWcvZ2dwbG90P3NyYz1oYXNoJmFtcDtyZWZfc3JjPXR3c3JjJTVFdGZ3Ij4jZ2dwbG90PC9hPiA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL2hhc2h0YWcvZGF0YXZpej9zcmM9aGFzaCZhbXA7cmVmX3NyYz10d3NyYyU1RXRmdyI+I2RhdGF2aXo8L2E+IGJ1dCBzdGlsbCBzY2FyZWQgb2YgdHlwaW5nIDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vaGFzaHRhZy9jb2RlP3NyYz1oYXNoJmFtcDtyZWZfc3JjPXR3c3JjJTVFdGZ3Ij4jY29kZTwvYT4/IDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vX3B2aWN0b3JyP3JlZl9zcmM9dHdzcmMlNUV0ZnciPkBfcHZpY3RvcnI8L2E+IGVzcXVpc3NlIHBhY2thZ2UgaGFzIHlvdSBjb3ZlcmVkIDxhIGhyZWY9Imh0dHBzOi8vdC5jby8xdklEWGNWQUFGIj5odHRwczovL3QuY28vMXZJRFhjVkFBRjwvYT4gPGEgaHJlZj0iaHR0cHM6Ly90LmNvL1JsVGtwdG5yTnYiPnBpYy50d2l0dGVyLmNvbS9SbFRrcHRuck52PC9hPjwvcD4mbWRhc2g7IFJhZG9zbGF3IFBhbmN6YWsgKEBSUGFuY3phaykgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9SUGFuY3phay9zdGF0dXMvMTA0NzAxOTU4ODY1ODA0MDgzMj9yZWZfc3JjPXR3c3JjJTVFdGZ3Ij5PY3RvYmVyIDIsIDIwMTg8L2E+PC9ibG9ja3F1b3RlPgo8c2NyaXB0IGFzeW5jIHNyYz0iaHR0cHM6Ly9wbGF0Zm9ybS50d2l0dGVyLmNvbS93aWRnZXRzLmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CgoKCjwhLS0gIyMgVGFibG9sYXIgLS0+CgoKLS0tCgoKIyBCYXrEsSBhcmF5w7x6bGVyCgpodHRwczovL3NiYWxjaS5naXRodWIuaW8vTXlSQ29kZXNGb3JEYXRhQW5hbHlzaXMvUi1BcmF5dXpsZXIubmIuaHRtbAoKCi0tLQoKCiMjIFJjbWRyCgpgYGAKbGlicmFyeShSY21kcikKClJjbWRyOjpDb21tYW5kZXIoKQoKYGBgCgoKLSBBIENvbXBhcmF0aXZlIFJldmlldyBvZiB0aGUgUiBDb21tYW5kZXIgR1VJIGZvciBSCgpodHRwOi8vcjRzdGF0cy5jb20vYXJ0aWNsZXMvc29mdHdhcmUtcmV2aWV3cy9yLWNvbW1hbmRlci8KCgotLS0KCiMjIGphbW92aQoKaHR0cHM6Ly93d3cuamFtb3ZpLm9yZy8KCjwhLS0gIVshW10oaHR0cHM6Ly93d3cuamFtb3ZpLm9yZy9hc3NldHMvbWFpbi1zY3JlZW5zaG90LnBuZyldKGh0dHBzOi8vd3d3LmphbW92aS5vcmcvKSAtLT4KCgpodHRwczovL2Jsb2cuamFtb3ZpLm9yZy8yMDE4LzA3LzMwL3JqLmh0bWwKCjwhLS0gIVshW10oaHR0cHM6Ly9ibG9nLmphbW92aS5vcmcvYXNzZXRzL2ltYWdlcy9yai5wbmcpXShodHRwczovL2Jsb2cuamFtb3ZpLm9yZy8yMDE4LzA3LzMwL3JqLmh0bWwpIC0tPgoKLS0tCgojIFIgbmVyZWRlbiDDtsSfcmVuaWxpcgoKaHR0cHM6Ly9zYmFsY2kuZ2l0aHViLmlvL015UkNvZGVzRm9yRGF0YUFuYWx5c2lzL1doZXJlVG9MZWFyblIubmIuaHRtbAoKLS0tCgojIFNvbnJha2kgS29udWxhcgoKLSBSU3R1ZGlvIGlsZSBHaXRIdWIga3VsbGFuxLFtxLEKLSBSIE1hcmtkb3duIHZlIFIgTm90ZWJvb2sgaWxlIHRla3JhcmxhbmFiaWxpciByYXBvcgotIEhpcG90ZXogdGVzdGxlcmkKCgoKLS0tLS0KCgojIEdlcmkgQmlsZGlyaW0KCi0gR2VyaSBiaWxkaXJpbSBpw6dpbiB0xLFrbGF5xLFuxLF6OiBfW0dlcmkgYmlsZGlyaW0gZm9ybXVdKGh0dHBzOi8vZ29vLmdsL2Zvcm1zL1lqR1o1REhndFBsUjFSbkIzKV8KCgotLS0KCgo8c2NyaXB0IGlkPSJkc3EtY291bnQtc2NyIiBzcmM9Ii8vaHR0cHMtc2JhbGNpLWdpdGh1Yi1pby5kaXNxdXMuY29tL2NvdW50LmpzIiBhc3luYz48L3NjcmlwdD4KCjxkaXYgaWQ9ImRpc3F1c190aHJlYWQiPjwvZGl2Pgo8c2NyaXB0PgoKLyoqCiogIFJFQ09NTUVOREVEIENPTkZJR1VSQVRJT04gVkFSSUFCTEVTOiBFRElUIEFORCBVTkNPTU1FTlQgVEhFIFNFQ1RJT04gQkVMT1cgVE8gSU5TRVJUIERZTkFNSUMgVkFMVUVTIEZST00gWU9VUiBQTEFURk9STSBPUiBDTVMuCiogIExFQVJOIFdIWSBERUZJTklORyBUSEVTRSBWQVJJQUJMRVMgSVMgSU1QT1JUQU5UOiBodHRwczovL2Rpc3F1cy5jb20vYWRtaW4vdW5pdmVyc2FsY29kZS8jY29uZmlndXJhdGlvbi12YXJpYWJsZXMqLwovKgp2YXIgZGlzcXVzX2NvbmZpZyA9IGZ1bmN0aW9uICgpIHsKdGhpcy5wYWdlLnVybCA9IFBBR0VfVVJMOyAgLy8gUmVwbGFjZSBQQUdFX1VSTCB3aXRoIHlvdXIgcGFnZSdzIGNhbm9uaWNhbCBVUkwgdmFyaWFibGUKdGhpcy5wYWdlLmlkZW50aWZpZXIgPSBQQUdFX0lERU5USUZJRVI7IC8vIFJlcGxhY2UgUEFHRV9JREVOVElGSUVSIHdpdGggeW91ciBwYWdlJ3MgdW5pcXVlIGlkZW50aWZpZXIgdmFyaWFibGUKfTsKKi8KKGZ1bmN0aW9uKCkgeyAvLyBET04nVCBFRElUIEJFTE9XIFRISVMgTElORQp2YXIgZCA9IGRvY3VtZW50LCBzID0gZC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsKcy5zcmMgPSAnaHR0cHM6Ly9odHRwcy1zYmFsY2ktZ2l0aHViLWlvLmRpc3F1cy5jb20vZW1iZWQuanMnOwpzLnNldEF0dHJpYnV0ZSgnZGF0YS10aW1lc3RhbXAnLCArbmV3IERhdGUoKSk7CihkLmhlYWQgfHwgZC5ib2R5KS5hcHBlbmRDaGlsZChzKTsKfSkoKTsKPC9zY3JpcHQ+Cjxub3NjcmlwdD5QbGVhc2UgZW5hYmxlIEphdmFTY3JpcHQgdG8gdmlldyB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9kaXNxdXMuY29tLz9yZWZfbm9zY3JpcHQiPmNvbW1lbnRzIHBvd2VyZWQgYnkgRGlzcXVzLjwvYT48L25vc2NyaXB0PgoKCi0tLQoKCjwhLS0gYGBgIC0tPgo8IS0tICMgU2F2ZSBGaW5hbCBEYXRhIC0tPgoKPCEtLSBzYXZlZCBkYXRhIGFmdGVyIGFuYWx5c2lzIHRvIGBEYXRhLUFmdGVyLUFuYWx5c2lzLnhsc3hgLiAtLT4KCjwhLS0gc2F2ZVJEUyhteWRhdGEsICJEYXRhLUFmdGVyLUFuYWx5c2lzLnJkcyIpIC0tPgoKPCEtLSB3cml0ZXhsOjp3cml0ZV94bHN4KG15ZGF0YSwgIkRhdGEtQWZ0ZXItQW5hbHlzaXMueGxzeCIpIC0tPgoKPCEtLSBmaWxlLmluZm8oIkRhdGEtQWZ0ZXItQW5hbHlzaXMueGxzeCIpJGN0aW1lIC0tPgoKPCEtLSBgYGAgLS0+Cgo8IS0tIC0tLSAtLT4KCgojIExpYnJhcmllcyBVc2VkCgpgYGB7cn0KY2l0YXRpb24oKQpgYGAKCmBgYApjaXRhdGlvbigidGlkeXZlcnNlIikKY2l0YXRpb24oImZvcmVpZ24iKQpjaXRhdGlvbigidGlkeWxvZyIpCmNpdGF0aW9uKCJqYW5pdG9yIikKY2l0YXRpb24oImptdiIpCmNpdGF0aW9uKCJ0YW5ncmFtIikKY2l0YXRpb24oImZpbmFsZml0IikKY2l0YXRpb24oInN1bW1hcnl0b29scyIpCmNpdGF0aW9uKCJnZ3N0YXRwbG90IikKY2l0YXRpb24oInJlYWR4bCIpCmBgYAoKCmBgYHtyIGV2YWw9RkFMU0UsIGluY2x1ZGU9RkFMU0V9CmNpdGF0aW9uKCJ0aWR5dmVyc2UiKQpjaXRhdGlvbigiZm9yZWlnbiIpCmNpdGF0aW9uKCJ0aWR5bG9nIikKY2l0YXRpb24oImphbml0b3IiKQpjaXRhdGlvbigiam12IikKY2l0YXRpb24oInRhbmdyYW0iKQpjaXRhdGlvbigiZmluYWxmaXQiKQpjaXRhdGlvbigic3VtbWFyeXRvb2xzIikKY2l0YXRpb24oImdnc3RhdHBsb3QiKQpjaXRhdGlvbigicmVhZHhsIikKYGBgCgoKPCEtLSAtLS0gLS0+CgoKPCEtLSBgYGB7ciwgcmVzdWx0cz0nYXNpcyd9IC0tPgo8IS0tIHJlcG9ydDo6Y2l0ZV9wYWNrYWdlcyhzZXNzaW9uID0gc2Vzc2lvbkluZm8oKSkgLS0+CjwhLS0gYGBgIC0tPgoKCjwhLS0gLS0tIC0tPgoKYGBge3J9CnNlc3Npb25JbmZvKCkKYGBgCgotLS0KCgojIMSwbGV0acWfaW0gIAoKQ29tcGxldGVkIG9uIGByIFN5cy50aW1lKClgLiAgCgpTZXJkYXIgQmFsY2ksIE1ELCBQYXRob2xvZ2lzdCAgCmRyc2VyZGFyYmFsY2lAZ21haWwuY29tICAKCmh0dHBzOi8vcnB1YnMuY29tL3NiYWxjaS9DViAgIApodHRwczovL3NiYWxjaS5naXRodWIuaW8vICAKaHR0cHM6Ly9naXRodWIuY29tL3NiYWxjaSAgCmh0dHBzOi8vdHdpdHRlci5jb20vc2VyZGFyYmFsY2kKCi0tLQoKYGBge3J9CkNvbW1pdE1lc3NhZ2UgPC0gcGFzdGUoInVwZGF0ZWQgb24gIiwgU3lzLnRpbWUoKSwgc2VwID0gIiIpCgp3ZCA8LSBnZXR3ZCgpCgpnaXRDb21tYW5kIDwtIHBhc3RlKCJjZCAiLCB3ZCwgIiBcbiBnaXQgYWRkIC4gXG4gZ2l0IGNvbW1pdCAtLW1lc3NhZ2UgJyIsIENvbW1pdE1lc3NhZ2UsICInIFxuIGdpdCBwdXNoIG9yaWdpbiBtYXN0ZXIgXG4iLCBzZXAgPSAiIikKCnN5c3RlbShjb21tYW5kID0gZ2l0Q29tbWFuZCwgaW50ZXJuID0gVFJVRQopCgpgYGAKCgoKCgoKCgo=